package jwt0

import (
	"context"
)

// TokenInfo 用户信息
type TokenInfo struct {
	ID    string
	Roles []string
}

// AuthInterceptor 认证拦截器，对以authorization为头部，形式为`bearer token`的Token进行验证
func AuthInterceptor(ctx context.Context) (context.Context, error) {
	//token, err := grpc_auth.AuthFromMD(ctx, "bearer")
	//if err != nil {
	//	return nil, errors.New("token parser error")
	//}

	jwtUtil := JWTUtil{
		Cred: Credentials{
			//Secret: agollo.Get(apollo.SecretTxt, agollo.WithNamespace(apollo.NamespaceSecret)),
		},
		TokenStr: "",
	}
	tokenInfo, err := jwtUtil.ParseSignedString()
	if err != nil {
		return nil, err
	}

	//使用context.WithValue添加了值后，可以用Value(key)方法获取值
	newCtx := context.WithValue(ctx, "", tokenInfo)
	return newCtx, nil
}

//从token中获取用户唯一标识
func userClaimFromToken(tokenInfo TokenInfo) string {
	return tokenInfo.ID
}

// Token token认证
type Token struct {
	Value string
}

const headerAuthorize string = "authorization"

// GetRequestMetadata 获取当前请求认证所需的元数据
func (t *Token) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
	return map[string]string{headerAuthorize: "bearer " + t.Value}, nil
}

// RequireTransportSecurity 是否需要基于 TLS 认证进行安全传输
func (t *Token) RequireTransportSecurity() bool {
	return true
}
